This is a brief exploration of median sales prices by block group relative to median household income for Baltimore.
Data used are U.S. Census American Community Survey (ACS) 5-year estimates for 2012-2016 at the block group level.
13:43:05: Grabbing HMT geospatial table from EGIS server.
13:43:20: Formatting HMT geospatial table.
13:43:21: Loading ACS block group data from Excel sheets.
13:43:21: Joining ACS data to HMT geospatial table.
incomplete final line found on 'https://data.baltimorecity.gov/resource/h3fx-54q3.geojson'
The Question
Are there areas of Baltimore that are over-performing or under-performing in terms of median sales price compared to what we’d expect based on the area’s median household income?
The Model
On initial inspection it’s clear that ther is a positive linear relationship between median household income and median sales price. There are also block groups that have 0 for the median household income or for the median sales price for whatever reason, so we’ll filter those out.
hmt@data %>%
ggplot(aes(Median_Household_Income.2016, MSP1517eo)) +
geom_point() +
theme_iteam_presentations() +
#scale_color_discrete_iteam() +
#scale_color_manual(values = c(iteam.colors[3], iteam.colors[4], iteam.colors[2]), aesthetics = "color") +
#geom_smooth(method = "lm", color = iteam.colors[5]) +
#geom_ribbon(aes(ymin = lwr, ymax = upr), fill = iteam.colors[5], alpha = 0.2) +
labs(
title = "Baltimore Census Block Group\nHome Sales Price v. Income",
x = "Median Household Income",
y = "Median Sales Price",
caption = paste0(
"U.S. Census ACS 2012-2016 Data, block group geography.\n"
)
) +
theme(plot.caption = element_text(face = "plain"),
legend.title = element_blank())

lm.data <- subset(hmt, (Median_Household_Income.2016 > 0) & (MSP1517eo > 0))
Filtering out any block groups with median household income or median sales price of 0, we’re left with 577 block groups.
Applying a linear regression we get back several pieces of information.
# linear regression
lm.model <- lm(MSP1517eo ~ Median_Household_Income.2016, data = lm.data@data)
# select only columns we want to look at and tack on the prediction intervals
lm.data@data <- lm.data@data %>%
select(bg, MSP1517eo, Median_Household_Income.2016) %>%
cbind(predict.lm(lm.model, lm.data, interval = "prediction", level = 0.90)) %>%
mutate(outside.pred.int = as.factor(case_when(
MSP1517eo > upr ~ "above",
MSP1517eo < lwr ~ "below",
TRUE ~ "inside"))
)
For every $10,000 increase in the median household income, we expect a $28355 increase in the median sales price for the block group. With 90% confidence we can say that increase is between $26621 and $30088 for every $10,000 increase in median household income. This range is shown in the plot below in gray.
Under- and Over-Performance
So given the data and this model, what areas are “overperforming” or “underperforming” compared to where we’d expect their median sales price to fall?
One way* to examine this is to look at points that fall outside a prediction interval. A prediction interval is the range where we’d expect to see new data points show up with some level of confidence. We’ll pick a 90% prediction interval level (i.e. we’d expect to see new data to pop up in this range 90% of the time). That range is shown in light blue.
*This is actually a little hokey - we shouldn’t be using the model on the same data that we built the model with, but it’ll suffice for our purposes.
lm.data@data %>%
ggplot(aes(Median_Household_Income.2016, MSP1517eo)) +
geom_point(aes(color = outside.pred.int)) +
theme_iteam_presentations() +
#scale_color_discrete_iteam() +
scale_color_manual(values = c(iteam.colors[3], iteam.colors[4], iteam.colors[2]), aesthetics = "color") +
geom_smooth(method = "lm", color = iteam.colors[5]) +
geom_ribbon(aes(ymin = lwr, ymax = upr), fill = iteam.colors[5], alpha = 0.2) +
labs(
title = "Baltimore Census Block Group\nHome Sales Price v. Income",
x = "Median Household Income",
y = "Median Sales Price",
caption = paste0(
"Linear fit (blue line) with 90% confidence interval (gray band) and",
"90% prediction interval\n(light blue band) shown. ",
"U.S. Census ACS 2012-2016 Data, block group geography.\n"
)
) +
theme(plot.caption = element_text(face = "plain"),
legend.title = element_blank())

Blue dots above and blue block groups in the map below are the “overperformers,” red are the “underperformers.” Only 4 block groups fall below the 90% prediction interval and 41 block groups are above the 90% prediction interval.
lm.data@data %>% count(outside.pred.int)
Where are they?
pred.pal <- colorFactor(
domain = lm.data$outside.pred.int,
palette = c(iteam.colors[3], iteam.colors[4], NA)
)
leaflet() %>%
setView(lng = -76.6, lat = 39.3, zoom = 11) %>%
addProviderTiles(providers$Stamen.TonerLite) %>%
addPolygons(data = lm.data,
color = iteam.colors[2],
weight = 1,
opacity = 0.7,
fillColor = ~pred.pal(outside.pred.int),
#fillColor = iteam.colors[1],
fillOpacity = .7,
#opacity = 0,
label = ~as.character(lm.data$bg)
) %>%
addLegend("bottomright",
colors = c(iteam.colors[3], iteam.colors[4]),
labels = c("above", "below")) %>%
addPolygons(data = hoods,
weight = 2,
color = "black",
opacity = 0.6,
fillOpacity = 0,
label = ~hoods$label)
Many block groups that are already in healthy neighborhoods actually get higher sales prices than we’d expect given their household incomes. Two additional block groups that “outperform” that may be of note: one in Middle East that conatins Eager Park and much of the development near Johns Hopkins Hospital, the other in Patterson Park bordering Pulaski Highway on its north side.
Future Work?
This model is based only on a single variable - the median household income. Next steps would be to incorporate additional variables to understand their contribution to the median sales price and how that informs our conception of “under” or “over” performance.
LS0tDQp0aXRsZTogIkVsZXZhdGVkIGFuZCBTdXBwcmVzc2VkIFNhbGVzIFByaWNlcyINCiNzdWJ0aXRsZTogDQphdXRob3I6ICJKdXN0aW4gRWxzemFzeiINCmRhdGU6ICJGZWJydWFyeSA2LCAyMDE5Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAyDQogICAgdG9jX2Zsb2F0OiBmYWxzZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KLS0tDQoNClRoaXMgaXMgYSBicmllZiBleHBsb3JhdGlvbiBvZiBtZWRpYW4gc2FsZXMgcHJpY2VzIGJ5IGJsb2NrIGdyb3VwIHJlbGF0aXZlIHRvIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lIGZvciBCYWx0aW1vcmUuDQoNCkRhdGEgdXNlZCBhcmUgVS5TLiBDZW5zdXMgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAoQUNTKSA1LXllYXIgZXN0aW1hdGVzIGZvciAyMDEyLTIwMTYgYXQgdGhlIGJsb2NrIGdyb3VwIGxldmVsLg0KDQpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGg9NiwgZmlnLmhlaWdodD00LCBlY2hvPVQsIHdhcm5pbmc9RiwgbWVzc2FnZT1GLCBpbmNsdWRlPVQpDQpgYGANCg0KYGBge3IgZWNobyA9IEYsIGluY2x1ZGUgPSBUfQ0Kc291cmNlKCIuLi9jb2RlLzAwX2luaXRpYWxpemUuUiIpDQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkobGVhZmxldCkpDQoNCm9wdGlvbnMoc2NpcGVuPTEwMDAwMCkNCg0KaG10IDwtIGdldF9ibG9ja19ncm91cF9kYXRhKCkNCmhvb2RzIDwtIGdldF9uZWlnaGJvcmhvb2RfYm91bmRhcmllcygpDQpgYGANCg0KIyBUaGUgUXVlc3Rpb24NCg0KQXJlIHRoZXJlIGFyZWFzIG9mIEJhbHRpbW9yZSB0aGF0IGFyZSBvdmVyLXBlcmZvcm1pbmcgb3IgdW5kZXItcGVyZm9ybWluZyBpbiB0ZXJtcyBvZiBtZWRpYW4gc2FsZXMgcHJpY2UgY29tcGFyZWQgdG8gd2hhdCB3ZSdkIGV4cGVjdCBiYXNlZCBvbiB0aGUgYXJlYSdzIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lPw0KDQojIFRoZSBNb2RlbA0KDQpPbiBpbml0aWFsIGluc3BlY3Rpb24gaXQncyBjbGVhciB0aGF0IHRoZXIgaXMgYSBwb3NpdGl2ZSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgYW5kIG1lZGlhbiBzYWxlcyBwcmljZS4gVGhlcmUgYXJlIGFsc28gYmxvY2sgZ3JvdXBzIHRoYXQgaGF2ZSAwIGZvciB0aGUgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgb3IgZm9yIHRoZSBtZWRpYW4gc2FsZXMgcHJpY2UgZm9yIHdoYXRldmVyIHJlYXNvbiwgc28gd2UnbGwgZmlsdGVyIHRob3NlIG91dC4NCg0KYGBge3IgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDV9DQpobXRAZGF0YSAlPiUNCiAgZ2dwbG90KGFlcyhNZWRpYW5fSG91c2Vob2xkX0luY29tZS4yMDE2LCBNU1AxNTE3ZW8pKSArDQogIGdlb21fcG9pbnQoKSArDQogIHRoZW1lX2l0ZWFtX3ByZXNlbnRhdGlvbnMoKSArDQogICNzY2FsZV9jb2xvcl9kaXNjcmV0ZV9pdGVhbSgpICsNCiAgI3NjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKGl0ZWFtLmNvbG9yc1szXSwgaXRlYW0uY29sb3JzWzRdLCBpdGVhbS5jb2xvcnNbMl0pLCBhZXN0aGV0aWNzID0gImNvbG9yIikgKw0KICAjZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSBpdGVhbS5jb2xvcnNbNV0pICsgDQogICNnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGx3ciwgeW1heCA9IHVwciksIGZpbGwgPSBpdGVhbS5jb2xvcnNbNV0sIGFscGhhID0gMC4yKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmFsdGltb3JlIENlbnN1cyBCbG9jayBHcm91cFxuSG9tZSBTYWxlcyBQcmljZSB2LiBJbmNvbWUiLA0KICAgIHggPSAiTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUiLA0KICAgIHkgPSAiTWVkaWFuIFNhbGVzIFByaWNlIiwNCiAgICBjYXB0aW9uID0gcGFzdGUwKA0KICAgICAgIlUuUy4gQ2Vuc3VzIEFDUyAyMDEyLTIwMTYgRGF0YSwgYmxvY2sgZ3JvdXAgZ2VvZ3JhcGh5LlxuIg0KICAgICkNCiAgKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChmYWNlID0gInBsYWluIiksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQpgYGB7cn0NCmxtLmRhdGEgPC0gc3Vic2V0KGhtdCwgKE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lLjIwMTYgPiAwKSAmIChNU1AxNTE3ZW8gPiAwKSkNCmBgYA0KDQpGaWx0ZXJpbmcgb3V0IGFueSBibG9jayBncm91cHMgd2l0aCBtZWRpYW4gaG91c2Vob2xkIGluY29tZSBvciBtZWRpYW4gc2FsZXMgcHJpY2Ugb2YgMCwgd2UncmUgbGVmdCB3aXRoIGByIG5yb3cobG0uZGF0YUBkYXRhKWAgYmxvY2sgZ3JvdXBzLg0KDQpBcHBseWluZyBhIGxpbmVhciByZWdyZXNzaW9uIHdlIGdldCBiYWNrIHNldmVyYWwgcGllY2VzIG9mIGluZm9ybWF0aW9uLg0KDQpgYGB7cn0NCiMgbGluZWFyIHJlZ3Jlc3Npb24NCmxtLm1vZGVsIDwtIGxtKE1TUDE1MTdlbyB+IE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lLjIwMTYsIGRhdGEgPSBsbS5kYXRhQGRhdGEpDQoNCiMgc2VsZWN0IG9ubHkgY29sdW1ucyB3ZSB3YW50IHRvIGxvb2sgYXQgYW5kIHRhY2sgb24gdGhlIHByZWRpY3Rpb24gaW50ZXJ2YWxzDQpsbS5kYXRhQGRhdGEgPC0gbG0uZGF0YUBkYXRhICU+JSANCiAgc2VsZWN0KGJnLCBNU1AxNTE3ZW8sIE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lLjIwMTYpICU+JQ0KICBjYmluZChwcmVkaWN0LmxtKGxtLm1vZGVsLCBsbS5kYXRhLCBpbnRlcnZhbCA9ICJwcmVkaWN0aW9uIiwgbGV2ZWwgPSAwLjkwKSkgJT4lDQogIG11dGF0ZShvdXRzaWRlLnByZWQuaW50ID0gYXMuZmFjdG9yKGNhc2Vfd2hlbigNCiAgICBNU1AxNTE3ZW8gPiB1cHIgfiAiYWJvdmUiLA0KICAgIE1TUDE1MTdlbyA8IGx3ciB+ICJiZWxvdyIsDQogICAgVFJVRSB+ICJpbnNpZGUiKSkNCiAgKQ0KYGBgDQoNCioqRm9yIGV2ZXJ5ICQxMCwwMDAgaW5jcmVhc2UgaW4gdGhlIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lLCB3ZSBleHBlY3QgYSBcJGByIHJvdW5kKDEwMDAwICogY29lZmZpY2llbnRzKGxtLm1vZGVsKVsyXSwgMClgIGluY3JlYXNlIGluIHRoZSBtZWRpYW4gc2FsZXMgcHJpY2UgZm9yIHRoZSBibG9jayBncm91cC4qKiBXaXRoIDkwJSBjb25maWRlbmNlIHdlIGNhbiBzYXkgdGhhdCBpbmNyZWFzZSBpcyBiZXR3ZWVuIFwkYHIgcm91bmQoMTAwMDAgKiBjb25maW50KGxtLm1vZGVsLCBsZXZlbCA9IC45MClbMl0sIDApYA0KIGFuZCBcJGByIHJvdW5kKDEwMDAwICogY29uZmludChsbS5tb2RlbCwgbGV2ZWwgPSAuOTApWzRdLCAwKWAgZm9yIGV2ZXJ5ICQxMCwwMDAgaW5jcmVhc2UgaW4gbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUuIFRoaXMgcmFuZ2UgaXMgc2hvd24gaW4gdGhlIHBsb3QgYmVsb3cgaW4gZ3JheS4NCiANCiMgVW5kZXItIGFuZCBPdmVyLVBlcmZvcm1hbmNlIA0KIA0KU28gZ2l2ZW4gdGhlIGRhdGEgYW5kIHRoaXMgbW9kZWwsIHdoYXQgYXJlYXMgYXJlICJvdmVycGVyZm9ybWluZyIgb3IgInVuZGVycGVyZm9ybWluZyIgY29tcGFyZWQgdG8gd2hlcmUgd2UnZCBleHBlY3QgdGhlaXIgbWVkaWFuIHNhbGVzIHByaWNlIHRvIGZhbGw/DQoNCk9uZSB3YXkqIHRvIGV4YW1pbmUgdGhpcyBpcyB0byBsb29rIGF0IHBvaW50cyB0aGF0IGZhbGwgb3V0c2lkZSBhIHByZWRpY3Rpb24gaW50ZXJ2YWwuIEEgcHJlZGljdGlvbiBpbnRlcnZhbCBpcyB0aGUgcmFuZ2Ugd2hlcmUgd2UnZCBleHBlY3QgdG8gc2VlIG5ldyBkYXRhIHBvaW50cyBzaG93IHVwIHdpdGggc29tZSBsZXZlbCBvZiBjb25maWRlbmNlLiBXZSdsbCBwaWNrIGEgOTAlIHByZWRpY3Rpb24gaW50ZXJ2YWwgbGV2ZWwgKGkuZS4gd2UnZCBleHBlY3QgdG8gc2VlIG5ldyBkYXRhIHRvIHBvcCB1cCBpbiB0aGlzIHJhbmdlIDkwJSBvZiB0aGUgdGltZSkuIFRoYXQgcmFuZ2UgaXMgc2hvd24gaW4gbGlnaHQgYmx1ZS4NCg0KKlRoaXMgaXMgYWN0dWFsbHkgYSBsaXR0bGUgaG9rZXkgLSB3ZSBzaG91bGRuJ3QgYmUgdXNpbmcgdGhlIG1vZGVsIG9uIHRoZSBzYW1lIGRhdGEgdGhhdCB3ZSBidWlsdCB0aGUgbW9kZWwgd2l0aCwgYnV0IGl0J2xsIHN1ZmZpY2UgZm9yIG91ciBwdXJwb3Nlcy4NCg0KYGBge3IgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDV9DQpsbS5kYXRhQGRhdGEgJT4lDQogIGdncGxvdChhZXMoTWVkaWFuX0hvdXNlaG9sZF9JbmNvbWUuMjAxNiwgTVNQMTUxN2VvKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IG91dHNpZGUucHJlZC5pbnQpKSArDQogIHRoZW1lX2l0ZWFtX3ByZXNlbnRhdGlvbnMoKSArDQogICNzY2FsZV9jb2xvcl9kaXNjcmV0ZV9pdGVhbSgpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoaXRlYW0uY29sb3JzWzNdLCBpdGVhbS5jb2xvcnNbNF0sIGl0ZWFtLmNvbG9yc1syXSksIGFlc3RoZXRpY3MgPSAiY29sb3IiKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gaXRlYW0uY29sb3JzWzVdKSArIA0KICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGx3ciwgeW1heCA9IHVwciksIGZpbGwgPSBpdGVhbS5jb2xvcnNbNV0sIGFscGhhID0gMC4yKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmFsdGltb3JlIENlbnN1cyBCbG9jayBHcm91cFxuSG9tZSBTYWxlcyBQcmljZSB2LiBJbmNvbWUiLA0KICAgIHggPSAiTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUiLA0KICAgIHkgPSAiTWVkaWFuIFNhbGVzIFByaWNlIiwNCiAgICBjYXB0aW9uID0gcGFzdGUwKA0KICAgICAgIkxpbmVhciBmaXQgKGJsdWUgbGluZSkgd2l0aCA5MCUgY29uZmlkZW5jZSBpbnRlcnZhbCAoZ3JheSBiYW5kKSBhbmQiLA0KICAgICAgIjkwJSBwcmVkaWN0aW9uIGludGVydmFsXG4obGlnaHQgYmx1ZSBiYW5kKSBzaG93bi4gIiwNCiAgICAgICJVLlMuIENlbnN1cyBBQ1MgMjAxMi0yMDE2IERhdGEsIGJsb2NrIGdyb3VwIGdlb2dyYXBoeS5cbiINCiAgICApDQogICkgKw0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KDQpCbHVlIGRvdHMgYWJvdmUgYW5kIGJsdWUgYmxvY2sgZ3JvdXBzIGluIHRoZSBtYXAgYmVsb3cgYXJlIHRoZSAib3ZlcnBlcmZvcm1lcnMsIiByZWQgYXJlIHRoZSAidW5kZXJwZXJmb3JtZXJzLiIgT25seSA0IGJsb2NrIGdyb3VwcyBmYWxsIGJlbG93IHRoZSA5MCUgcHJlZGljdGlvbiBpbnRlcnZhbCBhbmQgNDEgYmxvY2sgZ3JvdXBzIGFyZSBhYm92ZSB0aGUgOTAlIHByZWRpY3Rpb24gaW50ZXJ2YWwuIA0KDQpgYGB7cn0NCmxtLmRhdGFAZGF0YSAlPiUgY291bnQob3V0c2lkZS5wcmVkLmludCkNCmBgYA0KDQpXaGVyZSBhcmUgdGhleT8NCg0KYGBge3J9DQpwcmVkLnBhbCA8LSBjb2xvckZhY3RvcigNCiAgZG9tYWluID0gbG0uZGF0YSRvdXRzaWRlLnByZWQuaW50LA0KICBwYWxldHRlID0gYyhpdGVhbS5jb2xvcnNbM10sIGl0ZWFtLmNvbG9yc1s0XSwgTkEpDQopDQoNCmxlYWZsZXQoKSAlPiUgDQogIHNldFZpZXcobG5nID0gLTc2LjYsIGxhdCA9IDM5LjMsIHpvb20gPSAxMSkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJFN0YW1lbi5Ub25lckxpdGUpICU+JQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gbG0uZGF0YSwNCiAgICAgICAgICAgICAgY29sb3IgPSBpdGVhbS5jb2xvcnNbMl0sDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjcsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wcmVkLnBhbChvdXRzaWRlLnByZWQuaW50KSwNCiAgICAgICAgICAgICAgI2ZpbGxDb2xvciA9IGl0ZWFtLmNvbG9yc1sxXSwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNywNCiAgICAgICAgICAgICAgI29wYWNpdHkgPSAwLA0KICAgICAgICAgICAgICBsYWJlbCA9IH5hcy5jaGFyYWN0ZXIobG0uZGF0YSRiZykNCiAgKSAlPiUNCiAgYWRkTGVnZW5kKCJib3R0b21yaWdodCIsDQogICAgICAgICAgICBjb2xvcnMgPSBjKGl0ZWFtLmNvbG9yc1szXSwgaXRlYW0uY29sb3JzWzRdKSwNCiAgICAgICAgICAgIGxhYmVscyA9IGMoImFib3ZlIiwgImJlbG93IikpICU+JQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC42LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5ob29kcyRsYWJlbCkNCmBgYA0KDQpNYW55IGJsb2NrIGdyb3VwcyB0aGF0IGFyZSBhbHJlYWR5IGluIGhlYWx0aHkgbmVpZ2hib3Job29kcyBhY3R1YWxseSBnZXQgaGlnaGVyIHNhbGVzIHByaWNlcyB0aGFuIHdlJ2QgZXhwZWN0IGdpdmVuIHRoZWlyIGhvdXNlaG9sZCBpbmNvbWVzLiBUd28gYWRkaXRpb25hbCBibG9jayBncm91cHMgdGhhdCAib3V0cGVyZm9ybSIgdGhhdCBtYXkgYmUgb2Ygbm90ZTogb25lIGluIE1pZGRsZSBFYXN0IHRoYXQgY29uYXRpbnMgRWFnZXIgUGFyayBhbmQgbXVjaCBvZiB0aGUgZGV2ZWxvcG1lbnQgbmVhciBKb2hucyBIb3BraW5zIEhvc3BpdGFsLCB0aGUgb3RoZXIgaW4gUGF0dGVyc29uIFBhcmsgYm9yZGVyaW5nIFB1bGFza2kgSGlnaHdheSBvbiBpdHMgbm9ydGggc2lkZS4NCg0KIyBGdXR1cmUgV29yaz8NCg0KVGhpcyBtb2RlbCBpcyBiYXNlZCBvbmx5IG9uIGEgc2luZ2xlIHZhcmlhYmxlIC0gdGhlIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lLiBOZXh0IHN0ZXBzIHdvdWxkIGJlIHRvIGluY29ycG9yYXRlIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIHVuZGVyc3RhbmQgdGhlaXIgY29udHJpYnV0aW9uIHRvIHRoZSBtZWRpYW4gc2FsZXMgcHJpY2UgYW5kIGhvdyB0aGF0IGluZm9ybXMgb3VyIGNvbmNlcHRpb24gb2YgInVuZGVyIiBvciAib3ZlciIgcGVyZm9ybWFuY2UuDQoNCg0K